package cn.com.wms.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.springframework.orm.hibernate4.HibernateTemplate;

import cn.com.wms.Base.FilterInfo;
import cn.com.wms.Base.QueryResult;
import cn.com.wms.Base.pageInfo.PagingBean;


/**
 * ClassName: BaseDaoImpl 
 * @Description: TODO
 * hibernate查询基本类
 * @author chj
 * @date 2017年5月27日
 */
public interface BaseDao<T> {

	public HibernateTemplate getHibernateTemplate();
	/**
	 * 
	 * 根据预定义的SQL执行数据库操作，建议用在删除或者更新,插入数据库表上面
	 * @param composedSQL 传入的SQL
	 * @param params 参数赋值(数组形式)
	 * @return 返回的是删除或则更新的记录数，没有为0
	 */
	public int delete_Or_Update_Hibernate_ComposedQuery(final String composedSQL,final Object[] params);
	
	/**
	 * 根据预定义的SQLId执行数据库操作，建议用在删除或者更新,插入数据库表上面
	 * @param queryID 传入的SQLID
	 * @param params 参数赋值(数组形式)
	 * @return 返回的是删除或则更新的记录数，没有为0
	 */
	public int delete_Or_Update_Hibernate_NamedQuery(final String queryID, final Object[] params);
	
	/**
	 * 根据对象删除
	 * @param bm
	 * @return 0：表示失败，1：表示成功
	 */
	public int delete_Hibernate_Object(T t);
	
	/**
	 * 根据SQL删除，JDBC调用
	 * @param sql 传入的SQL
	 * @return 0：表示失败，1：表示成功
	 */
	public int delete_Or_Update_JDBC(String sql);
	
	/**
	 * 根据ID删除指定记录
	 * @param cls 对应要删除的类
	 * @param id 对应类的主键
	 * @return  0：表示失败，1：表示成功
	 */
	public int delete_Hibernate_Object_ById(Class<? extends T> cls, Serializable id);
	
	/**
	 * 根据ID查询(对应Hibernate 中的get方法)
	 * @param cls
	 * @param id
	 * @return
	 */
	public T find_ByID_Hibernate_Get(Class<? extends T> cls, Serializable id);
	
	/**
	 * 根据ID查询(对应Hibernate 中的load方法)
	 * @param cls
	 * @param id
	 * @return
	 */
	public T findByID_Hibernate_Load(Class<? extends T> cls, Serializable id);
	
	/**
	 * 
	 * @param composedHQL 对应的HQL
	 * @param params 对应的条件参数，如果条件为空，既查询所有的记录
	 * @return 返回list
	 */
	public List<T> findAll_Hibernate_ComposedHQL(String composedHQL,Object[] params);
	
	/**
	 * 
	 * @param queryID 对应的是sqlId
	 * @param params 对应的条件参数
	 * @return 返回list
	 */
	public List<T> findAll_Hibernate_NamedQuery(String queryID, Object[] params);
	
	/**
	 * 根据预定义的SQLId执行数据库操作,插入数据库表
	 * @param queryID 传入的SQLID
	 * @param params 参数赋值(数组形式)
	 * @return 返回的是删除或则更新的记录数，没有为0
	 */
	public int save_Hibernate_NamedQuery(final String queryID, final Object[] params);
	
	/**
	 * 添加对象，返回添加对象信息
	 * 
	 * @param <U>
	 * @param u
	 * @return
	 */
	public <U>Object save_Hibernate_ObjResult(U u);


	
	
	/**
	 * 根据对象插入
	 * @param bm
	 * @return 0：表示失败，1：表示成功
	 */
	public <U>int save_Hibernate_Object(U u);
	
	/**
	 * 根据预定义的SQL执行数据库操作,插入数据库表
	 * @param queryID 传入的SQL
	 * @param params 参数赋值(数组形式)
	 * @return 返回的是删除或则更新的记录数，没有为0
	 */
	public int save_Hibernate_ComposedQuery(final String composedSQL,final Object[] params);
	
	/**
	 * 根据预定义的SQLId执行数据库操作,更新数据库表
	 * @param queryID 传入的SQLID
	 * @param params 参数赋值(数组形式)
	 * @return 返回的是删除或则更新的记录数，没有为0
	 */
	public int update_Hibernate_NamedQuery(final String queryID, final Object[] params);
	
	/**
	 * 根据对象更新
	 * @param bm
	 * @return 0：表示失败，1：表示成功
	 */
	public <U>int update_Hibernate_Object(U u);
	
	/**
	 * 根据预定义的SQL执行数据库操作,更新数据库表
	 * @param queryID 传入的SQL
	 * @param params 参数赋值(数组形式)
	 * @return 返回的是删除或则更新的记录数，没有为0
	 */
	public int update_Hibernate_ComposedQuery(final String composedSQL,final Object[] params);
	
	/**
	 * 
	 * @param composedHQL
	 * @param filters 传入的查询条件
	 * @return list
	 */
	public List<T> findList_Hibernate_D_ComposedHQL(String composedHQL,FilterInfo filters);
	
	/**
	 * 
	 * @param composedHQL
	 * @param filters 传入的查询条件
	 * @return 总数
	 */
	public int findCount_Hibernate_D_ComposedHQL(String composedHQL,FilterInfo filters);
	
	/**
	 * 
	 * @param composedListHQL 查询listHQL from class
	 * @param composedCountHQL 查询的countHQL
	 * @param filters 查询条件
	 * @param queryBean 查询从哪行开始到哪行结束
	 * @return 返回的结果，list+count
	 */
	public QueryResult queryPage_Hibernate_D_ComposedHQL(String composedListHQL,String composedCountHQL,FilterInfo filters ,final PagingBean pageBean);
	
	/**
	 * 支持多表查询，返回的结果集list中是对象数组
	 * @param composedListHQL
	 * @param filters
	 * @return
	 */
	public  List findListObj_Hibernate_D_ComposedHQL(String composedListHQL,final FilterInfo filters );
	
//	/**
//	 * 
//	 * 要获取原生态的IbatIs的方式 通过srping 注入
//	 * */
//	public SqlMapClient getSqlMapClient();
//	
//	/**
//	 * 
//	 * 要获取原生态的IbatIs的方式 通过srping 注入
//	 * */
//	public void setSqlMapClient(SqlMapClient sqlMapClient);
//	
	/**
	 * 支持SPRING JdbcTemplate 原生SQL查询
	 * 
	 * @param sql
	 * @return
	 */
	public List queryListOfJdbcTemplate(String sql);

}
